package cn.chinaunicom.sdsi.frm.workflow.task.dao.impl;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import cn.chinaunicom.sdsi.frm.workflow.bean.TaskVO;
import cn.chinaunicom.sdsi.frm.workflow.common.UtilDateTime;
import cn.chinaunicom.sdsi.frm.workflow.task.dao.ActTaskDao;

/**
 * 任务模块数据访问层组件
 * 
 * @author liyh
 * 
 */
@Repository("actTaskDao")
public class ActTaskDaoImpl implements ActTaskDao {

	private static final Log log = LogFactory.getLog(ActTaskDaoImpl.class);

	/**
	 * activiti工作流提供的任务组件
	 */
	private TaskService taskService;

	/**
	 * 根据查询条件分页查询版本最新的流程定义
	 * 
	 * @param vo
	 *            任务查询实体
	 * @param firstResult
	 *            首条数据位置
	 * @param maxResults
	 *            页面大小
	 * @return 查询结果集合
	 */
	@Override
	public List<Task> listToDo4Page(TaskVO vo, int firstResult, int maxResults) {

		TaskQuery todoTaskQuery = taskService.createTaskQuery().includeProcessVariables();

		makeCondition(todoTaskQuery, vo);
		log.debug("search Task use DAO, add condition done");

		return todoTaskQuery.orderByTaskCreateTime().desc().listPage(firstResult, maxResults);
	}

	/**
	 * 据传入参数查询符合条件的记录条数
	 * 
	 * @param vo
	 *            任务查询实体
	 * @return 符合条件总条数
	 */
	@Override
	public long listFilteredCount(TaskVO vo) {
		TaskQuery todoTaskQuery = taskService.createTaskQuery();

		makeCondition(todoTaskQuery, vo);
		log.debug("search Task use DAO, get FilteredCount ");

		return todoTaskQuery.count();
	}

	/**
	 * 据查询条件查询全部记录的条数
	 * 
	 * @param vo
	 *            任务查询实体
	 * @return 总条数
	 */
	@Override
	public long listTotalCount(TaskVO vo) {
		// 普通查询不支持多人，暂只查第一岗位
		String userId = vo.getAssigneeIds()[0];
		TaskQuery todoTaskQuery = taskService.createTaskQuery();

		log.debug("search Task use DAO, get TotalCount ");

		return todoTaskQuery.taskAssignee(userId).active().count();
	}

	/**
	 * 复用拼装查询条件
	 * 
	 * @param query
	 * @return
	 */
	private TaskQuery makeCondition(TaskQuery query, TaskVO vo) {

		// 普通查询不支持多人，暂只查第一岗位
		String userId = vo.getAssigneeIds()[0];
		query = query.taskAssignee(userId).active();

		// 依据流程标题查询
		if (!StringUtils.isBlank(vo.getTitle())) {
			String title = vo.getTitle();
			query = query.processVariableValueLike("title", "%" + title + "%");
		}
		// 依据环节名称查询
		if (!StringUtils.isBlank(vo.getLinkName())) {
			String linkName = vo.getLinkName();
			query = query.taskNameLike("%" + linkName + "%");
		}
		// 依据任务的创建时间查询
		if (!StringUtils.isBlank(vo.getCreateTimeStart())) {
			Date createTimeStart = UtilDateTime.str2Date(vo.getCreateTimeStart(), "yyyy-MM-dd");
			query = query.taskCreatedAfter(createTimeStart);
		}
		if (!StringUtils.isBlank(vo.getCreateTimeEnd())) {
			Date createTimeEnd = UtilDateTime.str2Date(vo.getCreateTimeEnd(), "yyyy-MM-dd");
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(createTimeEnd);
			calendar.add(Calendar.DATE, 1);
			query = query.taskCreatedBefore(calendar.getTime());
		}

		return query;
	}

	/**
	 * 据参数名返回参数值
	 * 
	 * @param task
	 *            任务
	 * @param varName
	 *            变量名称
	 * @return 返回索取的对象
	 */
	@Override
	public Object parseVariable(Task task, String varName) {
		log.debug("search task vars: " + varName);

		return task.getProcessVariables().get(varName);
	}

	@Autowired
	public void setTaskService(TaskService taskService) {
		this.taskService = taskService;
	}

}
